﻿using QldtSdh.GUI.Common;
using QldtSdh.GUI.Utils;
using System;
using System.Windows.Forms;
using QldtSdh.GUI.DuLieu;
using QldtSdh.BLL;
using QldtSdh.GUI.XetTotNghiep;
using QldtSdh.GUI.DaoTao;
using System.Diagnostics;

namespace QldtSdh.GUI
{
    public partial class FormMain : Form
    {
        private BaseUserControl GetActiveBaseUC()
        {
            try { return pnlMain.Controls[0] as BaseUserControl; }
            catch { return null; }
        }

        #region public static DAL.Models.NguoiSuDung NguoiSuDung {get; private set;} // Người dùng đang tác nghiệp
        /// <summary>
        /// Người sử dụng hiện tại của chương trình
        /// </summary>
        public static DAL.Models.AppUser NguoiSuDung { get; private set; }
        #endregion

        #region public DAL.Models.HocKy HocKy {get; private set;} // Học kỳ đang làm việc
        /// <summary>
        /// Học kỳ đang làm việc
        /// </summary>
        public DAL.Models.HocKy HocKy { get; private set; }

        private void SetHocKy(DAL.Models.HocKy newHocKy)
        {
            HocKy = newHocKy;
            if (HocKy == null)
            {
                lblHocKy.Visible = false;
                lnkHocKy.Text = "Chọn học kỳ tác nghiệp";
                miDaoTao_InTKB.Enabled = miDaoTao_KeHoachDaoTao.Enabled = miDaoTao_LapKeHoachDaoTao.Enabled = miDaoTao_TaoLopHocPhan.Enabled = miDaoTao_QuanLyLopHocPhan.Enabled = miDaoTao_ThongKeGioGiang.Enabled = miKhaoThi.Enabled = false;
            }
            else
            {
                lblHocKy.Visible = true;
                lnkHocKy.Text = HocKy.TenHocKyDayDu;
                miDaoTao_InTKB.Enabled = miDaoTao_KeHoachDaoTao.Enabled = miDaoTao_LapKeHoachDaoTao.Enabled = miDaoTao_TaoLopHocPhan.Enabled = miDaoTao_QuanLyLopHocPhan.Enabled = miDaoTao_ThongKeGioGiang.Enabled = miKhaoThi.Enabled = true;
            }

            var uc = this.GetActiveBaseUC();
            if (uc != null && uc is IHocKyChangable)
                (uc as IHocKyChangable).ChangeHocKy(newHocKy);
        }

        private void lnkHocKy_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            var dlg = new FormChonHocKyTacNghiep(HocKy);
            if (this.DimAndShowDialog(dlg) == System.Windows.Forms.DialogResult.OK)
            {
                string currentMaHocKy = "";
                if (HocKy != null)
                    currentMaHocKy = HocKy.MaHocKyGUID;
                var newHocKy = dlg.SelectedHocKy;
                if (newHocKy != null && newHocKy.MaHocKyGUID != currentMaHocKy)
                    this.SetHocKy(newHocKy);
            }
        }
        #endregion

        #region Chức năng Hệ thống

        private void tmrClientClock_Tick(object sender, EventArgs e)
        {
            lblClientDateTime.Text = System.DateTime.Now.ToString("dddd, dd/MM/yyyy - HH:mm");
        }

        public FormMain()
        {
            InitializeComponent();
            WireTrungEventHandlers();
            WireDungEventHandlers();

            DangXuat();
        }

        private void miHeThong_DangNhap_Click(object sender, EventArgs e)
        {
            var frm = new HeThong.FormDangNhap();
            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                this.DangNhapTheo(frm.NguoiSuDung);
            }
        }

        public void DangXuat()
        {
            FormMain.NguoiSuDung = null;
            lblLoginStatus.Text = "Chưa đăng nhập";

            LoadUcWelcome();

            miHeThong_DangNhap.Visible = true;
            miHeThong_DangXuat.Visible = false;
            miHeThong_DoiMatKhau.Visible = false;
            miHeThong_QuanLyNguoiDung.Visible = false;
            miHeThong_PhanQuyen.Visible = false;
            miHeThong_NhatKyHoatDong.Visible = false;
            miHeThong_CauHinh.Visible = false;
            miDuLieu.Visible = false;
            miDaoTao.Visible = false;
            miKhaoThi.Visible = false;
            miXetTotNghiep.Visible = false;
            miNghienCuuSinh.Visible = false;
            lnkHocKy.Visible = false;
            this.SetHocKy(null);
        }

        public void LoadUcWelcome()
        {
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC";
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(new HeThong.UcWelcome() { Dock = DockStyle.Fill });
        }

        public void DangNhapTheo(DAL.Models.AppUser nguoiSuDung)
        {
            #region Cập nhật giao diện
            FormMain.NguoiSuDung = nguoiSuDung;
            lblLoginStatus.Text = string.Format("Đã đăng nhập ({0} - {1})",
                FormMain.NguoiSuDung.UserName, FormMain.NguoiSuDung.Role);
            var isAdmin = nguoiSuDung.Role == (int)VAITRO.Admin;

            /*
             * Phần quyền sử dụng hệ thống
             * Khi nào triển khai thì uncomment
             */
            var myItems = BizPhanQuyen.GetItems(this.msMain);
            var lsUser_Function = BizPhanQuyen.GetListByUser(nguoiSuDung.UserName);
            foreach (var item in myItems)
            {
                if (lsUser_Function.Contains(item.Text))
                    item.Visible = true;
                else
                    item.Visible = false;
            }


            /*
             * Dù có phần quyền như thế nào đi nữa thì những chức năng dưới vẫn phải theo quy tắc này
             */
            miHeThong.Visible = true;
            miHeThong_DangNhap.Visible = false;
            miHeThong_DangXuat.Visible = true;
            miHeThong_DoiMatKhau.Visible = true;
            miHeThong_Thoat.Visible = true;
            miTroGiup.Visible = true;
            miTroGiup_GioiThieuChuongTrinh.Visible = true;
            miTroGiup_HuongDan.Visible = true;
            miTroGiup_CapNhatPhanMem.Visible = true;
            lnkHocKy.Visible = true;
            /*
             * Chỉ để thuận tiện cho việc test. Khi triển khai nhớ uncoomment
             */
            miHeThong_CauHinh.Visible = miHeThong_PhanQuyen.Visible = miHeThong_NhatKyHoatDong.Visible = miHeThong_QuanLyNguoiDung.Visible = isAdmin;

            /*
             * Khi triển khai thì comment những dòng sau
             */
            //miDuLieu.Visible = !isAdmin;
            //miDaoTao.Visible = !isAdmin;
            //miKhaoThi.Visible = !isAdmin;
            //miXetTotNghiep.Visible = !isAdmin;
            //lnkHocKy.Visible = !isAdmin;
            #endregion

            #region Nạp dữ liệu ban đầu
            // 1. Nạp danh sách Năm học, học kỳ

            // 2. SetHocKy
            #endregion
        }

        private void miHeThong_DangXuat_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có chắc chắn muốn đăng xuất không?", "Chú ý", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                DangXuat();
            }
        }

        private void miHeThong_NhatKyHoatDong_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormNhatKyHoatDong();
            dlg.ShowDialog(this);
        }

        private void miHeThong_PhanQuyen_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormPhanQuyen(this.msMain);
            dlg.ShowDialog(this);
        }

        private void miHeThong_QuanLyNguoiDung_Click(object sender, EventArgs e)
        {
            var dlg = new HeThong.FormQuanLyNguoiDung();
            dlg.ShowDialog(this);
        }

        private void miHeThong_Thoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void miHeThong_DoiMatKhau_Click(object sender, EventArgs e)
        {
            var fdg = new QldtSdh.GUI.HeThong.FormDoiMatKhau(NguoiSuDung);
            fdg.ShowDialog();
        }

        private void miHeThong_CauHinh_Click(object sender, EventArgs e)
        {
            var fdg = new QldtSdh.GUI.HeThong.FormCauHinhHeThong();
            fdg.ShowDialog();
        }

        #endregion

        #region Chức năng Quản lý Dữ liệu
        private void miDuLieu_CoSoDaoTao_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyCoSoDaoTao();
            frm.ShowDialog();
        }

        private void miDuLieu_DonViChuyenMon_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyDonVi();
            frm.ShowDialog();
        }

        private void miDuLieu_NganhDaoTao_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyNganhDaoTao();
            frm.ShowDialog();
        }

        private void miDuLieu_HocPhan_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyHocPhan();
            frm.ShowDialog();
        }

        private void miDuLieu_ChuongTrinhDaoTao_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyChuongTrinhDaoTao();
            frm.ShowDialog();
        }

        private void miDuLieu_DotTuyenSinh_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyDotTuyenSinh();
            frm.ShowDialog();
        }

        private void miDuLieu_KhoaHoc_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyKhoaHoc();
            frm.ShowDialog();
        }

        private void miDuLieu_LopKhoaNganh_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanlyLopKhoaNganh();
            frm.ShowDialog();
        }

        private void miDuLieu_GiangVien_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyGiangVien();
            frm.ShowDialog();
        }

        private void miDuLieu_PhongHoc_Click(object sender, EventArgs e)
        {
            var frm = new DuLieu.FormQuanLyPhongHoc();
            frm.ShowDialog();
        }

        private void miDuLieu_TenDeTai_Click(object sender, EventArgs e)
        {
            var frm = new FormQuanLyDeTaiLuanVan();
            frm.ShowDialog();
        }
        #endregion

        #region Chức năng Đào tạo
        private void miDaoTao_QuanLyHocKy_Click(object sender, EventArgs e)
        {
            var frm = new DaoTao.FormQuanLyNamHocHocKy();
            frm.ShowDialog();
        }

        private void miDaoTao_QuanLyLopHocPhan_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is DaoTao.UcQuanLyLopHocPhan)
                return;

            var uc = new DaoTao.UcQuanLyLopHocPhan();
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Quản lý Lớp học phần";
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miDaoTao_LapKeHoachDaoTao_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is DaoTao.UcQuanLyKeHoachDaoTao)
                return;

            var uc = new DaoTao.UcQuanLyKeHoachDaoTao();
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Lập Kế hoạch đào tạo";
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miInThoiKhoaBieu_GiangVien_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is UcInThoiKhoaBieu_GiangVien)
                return;

            var uc = new UcInThoiKhoaBieu_GiangVien();
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - In Thời khoá biểu Giảng viên";
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miLichBanGiangVien_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is UcLichBanGiangVien)
                return;
            var uc = new UcLichBanGiangVien();
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Quản lý mục nội dung bận của Giảng viên";
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miInThoiKhoaBieu_LopHocPhan_Click(object sender, EventArgs e)
        {

        }

        private void miDaoTao_ThongKeGioGiang_Click(object sender, EventArgs e)
        {
            if (HocKy != null)
            {
                var f = new FormThongKeGioGiang(HocKy);
                f.ShowDialog();
            }
        }

        private void miDaoTao_QuanLyBaoLuu_Click(object sender, EventArgs e)
        {
            var frm = new DaoTao.FormQuanLyBaoLuu();
            frm.ShowDialog();
        }

        private void miDaoTao_TaoLopHocPhan_Click(object sender, EventArgs e)
        {
            //var frm = new DaoTao.FormTaoLopHocPhanTrongKHDT(this.HocKy);
            //frm.ShowDialog();
            if (GetActiveBaseUC() is DaoTao.UcTaoLopHocPhanTrongKHDT)
                return;

            var uc = new DaoTao.UcTaoLopHocPhanTrongKHDT();
            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Tạo Lớp học phần trong Kế hoạch đào tạo";
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }
        #endregion

        #region Chức năng Khảo thí
        private void miKhaoThi_QuanLyDotThi_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is KhaoThi.UcQuanLyDotThi)
                return;

            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Quản lý Đợt thi";
            var uc = new KhaoThi.UcQuanLyDotThi();
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miKhaoThi_NhapBangDiemThi_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is KhaoThi.UcNhapBangDiemThi)
                return;

            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Nhập bảng điểm thi";
            var uc = new KhaoThi.UcNhapBangDiemThi();
            uc.SetHocKy(this.HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miKhaoThi_KiemTraBangDiemThi_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is KhaoThi.UcKiemTraBangDiemThi)
                return;

            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Kiểm tra bảng điểm thi";
            var uc = new KhaoThi.UcKiemTraBangDiemThi();
            uc.SetHocKy(this.HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miKhaoThi_NhapBangDiemQTHT_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is KhaoThi.UcNhapBangDiemQuaTrinhHocTap)
                return;

            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Nhập bảng điểm Quá trình học tập";
            var uc = new KhaoThi.UcNhapBangDiemQuaTrinhHocTap();
            uc.SetHocKy(HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }

        private void miKhaoThi_KiemTraBangDiemQTHT_Click(object sender, EventArgs e)
        {
            if (GetActiveBaseUC() is KhaoThi.UcKiemTraBangDiemQuaTrinhHocTap)
                return;

            this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Kiểm tra bảng điểm Quá trình học tập";
            var uc = new KhaoThi.UcKiemTraBangDiemQuaTrinhHocTap();
            uc.SetHocKy(this.HocKy);
            uc.Dock = DockStyle.Fill;
            pnlMain.Controls.Clear();
            pnlMain.Controls.Add(uc);
        }
        #endregion

        #region Chức năng Xét tốt nghiệp
        private void miXetTotNghiep_ChungChiDieuKien_Click(object sender, EventArgs e)
        {
            var frm = new XetTotNghiep.FormQuanLyChungChiDieuKien();
            frm.ShowDialog();
        }

        private void miXetTotNghiep_NapThongTinLuanVan_Click(object sender, EventArgs e)
        {
            var f = new FormQuanlyHocVien_ImportLuanVan();
            f.ShowDialog();
        }

        private void miXetTotNghiep_ThongKeKetQuaHocTap_Click(object sender, EventArgs e)
        {
            if (!(pnlMain.Controls[0] is XetTotNghiep.UcThongKeKetQuaHocTap))
            {
                this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Thống kê kết quả học tập";
                var uc = new XetTotNghiep.UcThongKeKetQuaHocTap();
                uc.Dock = DockStyle.Fill;
                pnlMain.Controls.Clear();
                pnlMain.Controls.Add(uc);
            }
        }

        private void miXetTotNghiep_QLHVTN_Click(object sender, EventArgs e)
        {
            if (!(pnlMain.Controls[0] is XetTotNghiep.UcQuanLyDanhSachDeNghiXetTotNghiep))
            {
                this.Text = "QUẢN LÝ ĐÀO TẠO SAU ĐẠI HỌC - Danh sách học viên tôt nghiệp";
                var uc = new XetTotNghiep.UcQuanLyDanhSachDeNghiXetTotNghiep();
                uc.Dock = DockStyle.Fill;
                pnlMain.Controls.Clear();
                pnlMain.Controls.Add(uc);
            }
        }
        #endregion

        #region Trợ giúp

        private void miTroGiup_HuongDan_Click(object sender, EventArgs e)
        {
            try
            {
                System.Diagnostics.Process.Start("UserGuide.pdf");
            }
            catch (Exception ex)
            {
                MessageBox.Show("File UserGuide.pdf không được tìm thấy trong hệ thống. Chi tiết: " + ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void miTroGiup_GioiThieuChuongTrinh_Click(object sender, EventArgs e)
        {
            var fdg = new QldtSdh.GUI.TroGiup.FormThongTinChuongTrinh();
            fdg.ShowDialog();
        }

        #endregion

        private void niMain_BalloonTipClosed(object sender, EventArgs e)
        {
            niMain.Visible = false;
        }

        public void Notify(string title, string message, int timeout = 5000, ToolTipIcon icon = ToolTipIcon.Info)
        {
            niMain.Icon = this.Icon;
            niMain.Visible = true;
            niMain.ShowBalloonTip(timeout, title, message, icon);
        }

        private void pnlMain_ControlRemoved(object sender, ControlEventArgs e)
        {
            try
            {
                if (e.Control is UcQuanLyLopHocPhan)
                {
                    if (FormResourcesViewer.IsShowing)
                        FormResourcesViewer.CloseIt();
                    FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.CloseIt();
                }
            }
            catch { }
        }

        internal void CloseUcAndShowWelcome(BaseUserControl uc)
        {
            LoadUcWelcome();
            try { uc.Dispose(); }
            catch { }
        }

        private void FormMain_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                FormResourcesViewer.MinimizeInstance();
                FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.MinimizeInstance();
            }
            else
            {
                FormResourcesViewer.RestoreInstance();
                FormLopHocPhan_ThoiKhoaBieu_KetQuaSaoChep.RestoreInstance();
            }
        }

        #region NCS

        private void miNghienCuuSinh_Click(object sender, EventArgs e)
        {
        }

        private void miNCS_HoSo_Click(object sender, EventArgs e)
        {
            var fdg = new QldtSdh.GUI.NCS.FormQuanLyHoSoNCS();
            fdg.ShowDialog();
        }

        private void miNCS_ThongBao_Click(object sender, EventArgs e)
        {
            var f = new QldtSdh.GUI.NCS.FormQuanLyThongBao();
            f.ShowDialog();
        }

        #endregion

        private void miTroGiup_CapNhatPhanMem_Click(object sender, EventArgs e)
        {
            Process.Start("AutoUpdate", System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name);
            Application.Exit();
        }
    }
}
